/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package hoja4;

/**
 *
 * @author luisorozco
 */
// se importan las diferentes librerias
import java.lang.RuntimeException;
import java.util.Scanner;
import java.util.InputMismatchException;
import java.text.DecimalFormat;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Hoja4<T> extends Stack<T> {
    
    
            /**metodo de la clase principal
            
            Utilizamos  IOException es una checked exception, por lo cual, en caso de ser declarada tiene que ser manejada 
            dentro del método. Existen dos modos de manejar una excepción: Arrojándola o tratándola. Cuando arrojas
            una excepción (usando la palabra reservada throws) quiere decir que en el método donde la arrojas no es 
            necesario darle un tratamiento en específico*/
           public static void main(String[] args) throws IOException
           {
            
               
            // declaramos una variable con un string
            String s = darExpresion();
         
           
             // creamos una objeto llamado pila de nuestra clase Stack
            Stack<String> pila = new Stack<String>();
                    
            
            // declaramos variables locales
            int resultado = 0;
            
            // aca se hara para obtener la longitud del String que tiene dicha variable que es  's'
               // pero lo que realmente queremos es ver que numeros y operando inserto el usuario
            int longitud = s.length();
            
            // hacemos un for segun la longitud que tenga la cadena longitud
            for(int i = 0 ; i < longitud; i++)
            {
                //declaramos una variables que nos servira para ver qeu caracter se va evaluar
                 char car = s.charAt(i);    
                 
                 // se hace varios if para ver si el caracter es un numero operando o es =
                 if(car=='(')
                 {
                     //si no hay nada se sale del ciclo y el resultado es 0
                         resultado = 0;
                 }
                 if(car=='1' || car=='2' ||car=='3' || car=='4' || car=='4' ||car=='5'|| car=='6' || car=='7' ||car=='8' || car=='9' || car=='0')
                 {
                     // revisa si fue un numero de 0 a 9, si es asi lo mete en la pila
                         pila.push(Character.toString(car));
                 }
                 if(car=='+')
                 {
                     // revisa si ingreso un más, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo suma
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando1 + operando2;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                 }
                 if(car=='-')
                 {
                      // revisa si ingreso un menos, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo resta
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando2 - operando1;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                 }
                 if(car=='*')
                 {
                      // revisa si ingreso un por, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo multiplica
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando1 * operando2;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                 }
                 
                 if(car=='/')
                 {
                      // revisa si ingreso un divisor, si es asi saca el ultimo numero de la pila junto con el penultimo  y lo divide
                     //y despues lo mete otra vez en la pila, pero en la posicion del penultimo numero
                        
                         int operando1 = Integer.parseInt(pila.pop());
                         int operando2 = Integer.parseInt(pila.pop());
                         resultado = operando2 / operando1;
                         String result1 = String.valueOf(resultado);
                         pila.push(result1);
                         
                 }
                 
                 // en este if revisa que si el ultimo caracter fue un = este imprimira el resultado y se sale del ciclo
                 if(car=='=')
                 {
                           System.out.println("+------------------------>  "+"El resultado es: "+ pila.pop() + "  <-------------------------+");
                           System.out.println("\n"+"+--------------------------------------------------------------------------+");
                           System.out.println("+--------------------------------------------------------------------------+");
                 }
                 
               
             }
            
        
        // TODO code application logic here
    }
    
     /** el siguiente metodo servira para guardar o almacenar la linea de operando y operadores que el usario ingrese*/
        public static String darExpresion() throws IOException
        {
            BufferedReader read = new BufferedReader(new InputStreamReader(System.in));
            System.out.println("\n"+"+--------------------------------------------------------------------------+");
            System.out.println("+---------------------Bienvenido a la Hoja 4-------------------------------+");
            System.out.println("+--------------------------------------------------------------------------+"+"\n");
            System.out.println("Ingrese la expresión a evaluar... NOTA: al finalizar ingrese el simbolo '=':");
          
             // creamos un objeto de reasLine el cual nos servira para leer la linea introducida por el usuario
            String s = read.readLine();
            return s;
        }
        
       

}


//prueba
